home *** CD-ROM | disk | FTP | other *** search
- TITL ' TMS7041 MODEM RUN CODE '
- IDT 'RUN1'
- OPTION XREF,TUNLST
- ************************************************************
- ** This code handles the run time operation and **
- ** communication of the modem. This includes the DTE **
- ** interface, 320 interface, and overspeed operations. **
- ** **
- ** Written by Peter Ehlig **
- ** **
- ** Revision 1.0 11/12/85 PETER EHLIG **
- ** Revision 1.1 1/28/86 PETER EHLIG **
- ** Revision 1.2 5/20/86 PETER EHLIG **
- ** **
- ** COPYRIGHT TEXAS INSTRUMENTS, 07/25/86 **
- ** **
- ************************************************************
- *
- * DEFINITIONS AND REFERENCES
- DEF GO320
- REF TOP,SCRAM,DSCRAM,PRINT
- *
- PAGE
- COPY DTE2.EQU
- *******----------------------------------------*******
- ***** DSP XMIT/RECEIVE ROUTINES *****
- *******----------------------------------------*******
- *
- GO320 CLR CMSTAT ; clear com status reg
- CLR S1718 ; initialize scrambler history
- CLR S9TO16 ; as all zeros
- CLR S1TO8 ;
- CLR D1718 ; initialize descrambler history
- CLR D9TO16 ; as all zeros
- CLR D1TO8 ;
- ANDP %NOT0,CPORT ; activate CTS to DTE
- ANDP %>3F,BPORT ; togglE B6,7 to
- ORP %>C0,BPORT ; reset 320 ACK lines
- *
- * START UP MODEM OR DLB TEST
- *
- STOPB2 MOV %3,XDIBIT ; SET DIBIT TO MARKS
- CALL @SCRAM ; AND SCRAMBLE IT
- BTJO %BIT0,SWSTAT,SENDAT ; SEND DATA IF CD SET
- BTJO %BIT2,SWSTAT,SENDAT ; OR IN ORG. MODE
- MOVP %>3F,DDDR ; TURN DPORT LINES OUT
- ORP %>3C,DPORT ; SEND CMND TO XMIT TONE
- JMP SNDTON ;
- *
- SENDAT MOV XDIBIT,A ; HOLD IT FOR TRANSMIT
- OR %>20,A ; OR IN COMMAND BITS
- MOVP %>3F,DDDR ; TURN DPORT LINES OUT
- ANDP %>C0,DPORT ; CLEAR OFF CURRENT BITS
- ORP A,DPORT ; SEND OUT SCRAM MARKS
- SNDTON ANDP %NOT6,BPORT ; LATCH NEW DATA
- ORP %BIT6,BPORT ; RESET READ BIT
- MOVP %>00,DDDR ; Reset DPORT as all inputs
- * TRANSMIT UNSCRAMBLED MARKS AND RECEIVE
- MRC1 BTJZP %BIT7,DPORT,MRC2 ; WAIT FOR WRITE FROM 320
- CHKTCH BTJOP %BIT6,DPORT,RECDTE ; WAIT FOR READ FROM 320
- BR @MRC3 ; PROCESS READ FROM 320
- RECDTE BTJOP %BIT1,SSTAT,DTEGET ; IS DTE REC BUF FULL
- XMTDTE BTJOP %BIT0,SSTAT,DTEPUT ; IS DTE TRANS BUF EMPTY
- JMP MRC1 ; LOOK AGAIN
- *
- PAGE
- *
- * CODE INTERFACE TO DTE
- *
- DTEGET EQU $
- MOVP RXBUF,A ; YES, GET THE CHARACTER?
- BTJZ %BIT4,SWSTAT,OVRSQT ; IS ESC CODE ENABLED
- CMP %>1B,A ; IF A <> ESCAPE
- JNE OVRSQT ; THEN CONTINUE
- BR @TOP ; ELSE RETURN TO MONITOR
- SQRT CLR A ; CLEAR COMMAND BUFFER
- MOVP %>3F,DDDR ; TURN DPORT OUT
- MOVP A,DPORT ; RESET COMMAND
- ANDP %NOT6,BPORT ; RESET THE READ ACKNOWLEDGE
- ORP %BIT6,BPORT ; LATCH SQUELCH COMMAND
- MOVP %>00,DDDR ; TURN DPORT IN
- ANDP %NOT0,BPORT ; TURN OFF THE CODEC
- BR @TOP ; AND RETURN TO MONITOR
- OVRSQT INC XCHCNT ; INCREMENT BYTE COUNT
- BTJO %BIT5,CMSTAT,DTEGER ; CHECK FOR BUF2 FULL
- BTJO %BIT3,CMSTAT,DTEG1 ; CHECK IF 1ST CHAR
- OR %BIT7,CMSTAT ; FLAG FOR START BIT
- MOV A,XBUF1 ; IF SO THEN RESTART
- MOV %>A,XBTCNT ; RESET XMT COUNT
- OR %BIT3,CMSTAT ; SET TRANS ACTIVE
- JMP XMTDTE ; CHECK OUTPUT
- DTEG1 MOV A,XBUF2 ; SAVE IT IN THE BUF2
- OR %BIT5,CMSTAT ; SET BUF2 FULL FLAG
- JMP XMTDTE ; CHECK OUTPUT
- *
- DTEGER EQU $ ; SQUELCH THE
- MOVD %BUFERR,MSGL ; SEND ERROR MESSAGE
- CALL @PRINT ; TO USER TERMINAL
- BR @SQRT ; EXIT ROUTINE
- *
- DTEPUT EQU $
- BTJZ %BIT4,CMSTAT,MRC1 ; CHECK FOR CHARACTER READY
- MOV RBUF2,A ; GET BUFFERED CHARACTER
- MOVP A,TXBUF ; SEND IT TO THE DTE
- AND %NOT4,CMSTAT ; RESET BUFFER FULL FLAG
- JMP MRC1 ; RETURN TO FLAG LOOP
- *
- PAGE
- * RECEIVE DIBITS FROM THE 320
- * 320 just finished writing to the buffer
- * DPORT IS SET TO ALL INPUTS EXCEPT WHEN 7742 IS OUTPUT
- MRC2 EQU $
- *--- MOVP %>30,DDDR ; PUT DIBIT RANGE AS INPUT
- ANDP %NOT7,BPORT ; TOGGLE B7 TO ENABLE RECEIVE
- * LATCH AND TO RESET 320 WRITE ACKNOWLEDGE(WACK)
- *
-
- MOVP DPORT,A ; GET THE RETURNED DATA
- MOV A,XDIBIT ; AND HOLD IT IN XDIBIT
- ORP %BIT7,BPORT ; TURN LATCHES OFF AFTER READ
- BTJZ %BIT5,A,CHKTCH ; IF NO CARRIER THEN DONE
- AND %3,XDIBIT ; AND OFF STATUS
- CALL @DSCRAM ; DESCRAMBLE IT
- BTJO %BIT2,CMSTAT,RCHAR1 ;CHECK FOR REC CHAR ACTIVE
- RRC XDIBIT ; CHECK DIBIT0
- JC RNB ; IF HIGH THEN CHECK NEXT
- RRC XDIBIT ; SAVE LSB OF RECEIVE CHAR
- RRC RBUF1 ; IN CHAR HOLD REG
- MOV %7,RBTCNT ; SET REC BIT COUNT REG
- JMP RCHAR0 ; SKIP OVER NEXT CHECK
- *
- RNB RRC XDIBIT ; CHECK DIBIT1
- JNC OVRRNB ; IF HIGH CHECK XMTCHR
- BR @CHKTCH ; ELSE GO BACK TO LOOP
- OVRRNB MOV %8,RBTCNT ; SET REC BIT COUNT REG
- RCHAR0 OR %BIT2,CMSTAT ; SET REC CHAR ACTIVE
- BR @RECDTE ; CHECK DTE
- *
- RCHAR1 SUB %2,RBTCNT ; CHECK BIT POSITION
- JP RCHAR3 ; IF > 0 GET 2 BITS
- JZ RCHAR2 ; IF = 0 GET 1 BIT
- RRC XDIBIT ; PUT BIT7 INTO
- RRC RBUF1 ; REC CHAR HOLD REG
- MOV RBUF1,RBUF2 ; PUT CHAR IN OUT BUFFER
- OR %BIT4,CMSTAT ; SET BUFFER FULL FLAG
- CLR RBUF1 ; CLEAR BUFFER FOR NEXT CHAR
- AND %NOT2,CMSTAT ; RESET REC CHAR ACTIVE
- JMP RNB ; CHECK DIBIT1 FOR START BIT
- *
- RCHAR2 RRC XDIBIT ; SAVE MSB OF RECEIVE CHAR
- RRC RBUF1 ; INTO REC CHAR HOLD REG
- RRC XDIBIT ; PUT BIT7 INTO
- RRC RBUF1 ; REC CHAR HOLD REG
- MOV RBUF1,RBUF2 ; PUT CHAR IN OUT BUFFER
- OR %BIT4,CMSTAT ; SET BUFFER FULL FLAG
- CLR RBUF1 ; CLEAR BUFFER FOR NEXT CHAR
- AND %NOT2,CMSTAT ; RESET REC CHAR ACTIVE
- BR @RECDTE ; CHECK DTE
- *
- RCHAR3 RRC XDIBIT ; MOVE DIBIT0 TO
- RRC RBUF1 ; REC CHAR HOLD REG
- RRC XDIBIT ; MOVE DIBIT1 TO
- RRC RBUF1 ; REC CHAR HOLD REG
- BR @RECDTE ; CHECK DTE
- *
- PAGE
- *
- * SEND DIBITS TO THE 320
- * 320 just read from the latches
- *
- MRC3 EQU $
- BTJO %BIT3,CMSTAT,TCHAR0 ; IS TRANS CHAR ACTIVE
- BR @STOPB2 ; IF NOT SEND STOPBITS
- TCHAR0 CLR XDIBIT ; CLEAR OUT DIBIT REG
- SUB %2,XBTCNT ; CHECK POSITION
- JP TCHAR6 ; > 2 MEANS TRANSMIT BITS
- JNZ TCHAR3 ; IF PATTERN ONE THEN ODD
- RRC XBUF1 ; GET BIT 7 FROM CHAR
- JNC TCHO0 ; IF NO CARRY DIBIT0=0
- OR %BIT0,XDIBIT ; ELSE DIBIT0=1
- TCHO0 BTJO %BIT5,CMSTAT,TCHAR1 ; IF BUF2 EMPTY
- AND %NOT3,CMSTAT ; RESET TRAN ACTIVE BIT
- OR %BIT1,XDIBIT ; SET DIBIT1 TO STOP
- JMP TCHSND ; AND SEND DIBIT
- TCHAR1 CMP %9,XCHCNT ; CHECK CHAR COUNT
- JL TCHAR2 ; IF < DON'T DELETE STOPBIT
- CLR XCHCNT ; CLEAR BYTE COUNT
- AND %NOT1,XDIBIT ; SEND DIBIT1 TO START
- MOV XBUF2,XBUF1 ; LOAD IN NEW CHAR
- MOV %9,XBTCNT ; SET BIT COUNT
- AND %NOT5,CMSTAT ; RESET BUF2 FULL FLAG
- JMP TCHSND ; SEND THE DIBIT
- TCHAR2 OR %BIT1,XDIBIT ; SEND DIBIT1 TO STOP
- MOV XBUF2,XBUF1 ; LOAD IN NEW CHAR
- OR %BIT7,CMSTAT ; FLAG IN START BIT
- MOV %>A,XBTCNT ; SET BIT COUNT
- AND %NOT5,CMSTAT ; RESET BUF2 FULL FLAG
- JMP TCHSND ; SEND THE DIBIT
- TCHAR3 BTJO %BIT5,CMSTAT,TCHAR4 ; IF BUF2 EMPTY
- AND %NOT3,CMSTAT ; RESET TRAN ACTIVE BIT
- BR @STOPB2 ; AND SEND MARKS
- TCHAR4 CMP %9,XCHCNT ; CHECK CHAR COUNT
- JL TCHAR5 ; IF < DON'T DELETE STOPBIT
- CLR XCHCNT ; CLEAR BYTE COUNT
- MOV XBUF2,XBUF1 ; LOAD IN NEW CHAR
- OR %BIT7,CMSTAT ; FLAG IN START BIT
- MOV %8,XBTCNT ; SET BIT COUNT
- AND %NOT5,CMSTAT ; RESET BUF2 FULL FLAG
- JMP TCHAR6 ; SEND THE DIBIT
- TCHAR5 MOV %1,XDIBIT ; SEND STOP THEN START
- MOV XBUF2,XBUF1 ; LOAD IN NEW CHAR
- MOV %9,XBTCNT ; SET BIT COUNT
- AND %NOT5,CMSTAT ; RESET BUF2 FULL FLAG
- JMP TCHSND ; SEND THE DIBIT
- TCHAR6 BTJZ %BIT7,CMSTAT,TCHAR7 ; START BIT NEEDED
- AND %NOT7,CMSTAT ; RESET START BIT FLAG
- JMP TCHO1 ; SKIP DIBIT1
- TCHAR7 RRC XBUF1 ; GET NEXT BIT OF CHAR
- JNC TCHO1 ; IF LOW SKIP BIT SET
- OR %1,XDIBIT ; ELSE SET DIBIT0 TO ONE
- TCHO1 RRC XBUF1 ; GET NEXT BIT OF CHAR
- JNC TCHSND ; IF LOW SKIP BIT SET
- OR %2,XDIBIT ; ELSE SET DIBIT1 TO ONE
- TCHSND EQU $
- CALL @SCRAM ; AND SCRAMBLE IT
- BTJO %BIT0,SWSTAT,GOT212 ; If CD set or in ORG mode
- BTJO %BIT2,SWSTAT,GOT212 ; cont, Else send ans. tone
- MOVP %>3F,DDDR ; SETUP DPORT FOR OUTPUT
- MOVP %>3C,DPORT ; RUN 212 ANS/W. ANS.TONE
- BR @NO212 ; Send it to 320
- *
- GOT212 MOV XDIBIT,A ; HOLD IT FOR TRANSMIT
- MOVP %>3F,DDDR ; POINT DPORT OUT
- ANDP %>F0,DPORT ; CLEAR OUT DIBIT VALUE
- ORP A,DPORT ; SEND TO PORT
- NO212 ANDP %NOT6,BPORT ; Latch data into xmt.buffer
- ORP %BIT6,BPORT ; and reset Read Ack(RACK)
- MOVP %>00,DDDR ; Reset DPORT as all inputs
- BR @RECDTE ; WAIT FOR RETURN LOOP
- *
- *******----------------------------------------*******
- ***** screen messages - text statements *****
- *******----------------------------------------*******
- BUFERR TEXT 'DTE BUFFER OVERFLOW ERROR'
- BYTE 0
- *
- *
- END